﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ITProject.Domain.Entities;
using ITProject.Repository.Abstract;
using System.ComponentModel.DataAnnotations;

namespace ITProject.WebUI.Models.Account
{
    /// <summary>
    /// Model podstawowych informacji o użytkowniku stosowane w wyświetlaniu listy użytkownikow
    /// Autor: Natalia Wyczislok
    /// </summary>
    public class UserListViewModel
    {
        [MaxLength(20, ErrorMessage="Za długi login")]
        public string Login { get; set; }
        [MaxLength(30, ErrorMessage = "Za długie imię")]
        public string FirstName { get; set; }
        [MaxLength(30, ErrorMessage = "Za długie nazwisko")]
        public string LastName { get; set; }
        public string Avatar { get; set; }
        [MaxLength(30, ErrorMessage = "Za długi adres email")]
        [RegularExpression(@"^[_A-Za-z0-9-]+@[A-Za-z0-9]+.[A-Za-z0-9]{2,}", ErrorMessage = "Zły format adresu email")]
        public string Email { get; set; }
        [MaxLength(20, ErrorMessage="Za długa nazwa państwa")]
        public string Country { get; set; }
        [MaxLength(20, ErrorMessage="Za długa nazwa miasta")]
        public string City { get; set; }
        /// <summary>
        /// Metoda statyczna która dokonuje konwersji encji uzytkownikow oraz profili na liste instancji modelu UserList
        /// Autor: Natalia Wyczislok
        /// </summary>
        /// <param name="u">Encja User</param>
        /// <param name="p">Encja Profil</param>
        /// <param name="userRepo">Lista instancji modelu UserList</param>
        /// <returns></returns>
        public static IEnumerable<UserListViewModel> Convert(IEnumerable<User> u, IEnumerable<Profil> p, IUserRepository userRepo)
        {
            //złączenie zewnętrzne dwóch encji
            IEnumerable<UserListViewModel> query = from user in u
                                                          join profill in p on user.Id equals profill.Id into outer
                                                          from profil in outer.DefaultIfEmpty()
                                                          select new UserListViewModel { Login = user.Login, 
                                                              LastName = user.LastName, 
                                                              FirstName = user.FirstName,                      Email = user.Email,
                                                              City=(profil==null || profil.City==null)?"Brak miasta":profil.City,
                                                              Country=(profil==null || profil.Country==null)?"Brak państwa":profil.Country,
                                                              Avatar=(profil==null || profil.AvatarPath==null)?((user.Sex=='K'.ToString())?"AvatarW.png":"AvatarM.png"):profil.AvatarPath};

            return query;
        }
    }
}